home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / wais / ftw / scandir.c < prev    next >
C/C++ Source or Header  |  1995-05-09  |  2KB  |  87 lines

  1. /*
  2. **  SCANDIR
  3. **  Scan a directory, collecting all (selected) items into a an array.
  4. */
  5.  
  6. #include <sys/types.h>
  7. #include <stdio.h>
  8. #include "pdftw.h"
  9.  
  10. #ifdef    RCSID
  11. static char RCS[] = "$Header: /proj/wais/wais-8-b2/lib/RCS/scandir.c,v 1.1 91/07/17 16:38:01 jonathan Exp $";
  12. #endif    /* RCSID */
  13.  
  14. /* Initial guess at directory size. */
  15. #define INITIAL_SIZE    20
  16.  
  17. extern char        *malloc();
  18. extern char        *realloc();
  19. extern char        *strcpy();
  20.  
  21. int
  22. scandir(name, list, selector, sorter)
  23.     char          *name;
  24.     struct dirent        ***list;
  25.     int             (*selector)();
  26.     int             (*sorter)();
  27. {
  28.     register struct dirent      **names;
  29.     register struct dirent      *entp;
  30.     register DIR      *dirp;
  31.     register int       i;
  32.     register int       size;
  33.  
  34.     /* Get initial list space and open directory. */
  35.     size = INITIAL_SIZE;
  36.     names = (struct dirent **)malloc(size * sizeof names[0]);
  37.     if (names == NULL)
  38.     return -1;
  39.     dirp = opendir(name);
  40.     if (dirp == NULL)
  41.     return -1;
  42.  
  43.     /* Read entries in the directory. */
  44.     for (i = 0; entp = readdir(dirp); )
  45.     if (selector == NULL || (*selector)(entp)) {
  46.         /* User wants them all, or he wants this one. */
  47.         if (++i >= size) {
  48.         size <<= 1;
  49.         names = (struct dirent **)
  50.             realloc((char *)names, size * sizeof names[0]);
  51.         if (names == NULL) {
  52.             closedir(dirp);
  53.             return -1;
  54.         }
  55.         }
  56.  
  57.         /* Copy the entry. */
  58. #ifdef DIRSIZ
  59.         names[i - 1] = (struct dirent *)malloc(DIRSIZ(entp));
  60. #else
  61.         names[i - 1] = (struct dirent *)malloc(sizeof(struct dirent) 
  62.                             + strlen(entp->d_name)+1);
  63. #endif
  64.         if (names[i - 1] == NULL) {
  65.         closedir(dirp);
  66.         return -1;
  67.         }
  68.         names[i - 1]->d_ino = entp->d_ino;
  69.         names[i - 1]->d_reclen = entp->d_reclen;
  70. #ifndef USE_DIRENT
  71.         names[i - 1]->d_namlen = entp->d_namlen;
  72. #endif
  73.         (void)strcpy(names[i - 1]->d_name, entp->d_name);
  74.     }
  75.  
  76.     /* Close things off. */
  77.     names[i] = NULL;
  78.     *list = names;
  79.     closedir(dirp);
  80.  
  81.     /* Sort? */
  82.     if (i && sorter)
  83.     qsort((char *)names, i, sizeof names[0], sorter);
  84.  
  85.     return i;
  86. }
  87.